/*
  需求：编写服务端，接收客户端发送请求，提取其中两个整型数据，相加后将结果响应回客户端。
  步骤：
    1.包含头文件；
    2.初始化 ROS2 客户端；
    3.定义节点类；
      3-1.创建服务端；
      3-2.处理请求数据并响应结果。
    4.调用spin函数，并传入节点对象指针；
    5.释放资源。
*/

// 1.包含头文件；
#include "rclcpp/rclcpp.hpp"
#include "base_interfaces_demo/srv/add_ints.hpp"

using base_interfaces_demo::srv::AddInts;

using std::placeholders::_1;
using std::placeholders::_2;

// 3.定义节点类；
class MinimalService : public rclcpp::Node
{
public:
  MinimalService() : Node("minimal_service")
  {
    // 3-1.创建服务端；
    server = this->create_service<AddInts>("add_ints", std::bind(&MinimalService::add, this, _1, _2));
    RCLCPP_INFO(this->get_logger(), "add_ints 服务端启动完毕，等待请求提交...");
  }

private:
  rclcpp::Service<AddInts>::SharedPtr server;
  // 3-2.处理请求数据并响应结果。
  void add(const AddInts::Request::SharedPtr req, const AddInts::Response::SharedPtr res)
  {
    res->sum = req->num1 + req->num2;
    RCLCPP_INFO(this->get_logger(), "请求数据:(%d,%d),响应结果:%d", req->num1, req->num2, res->sum);
  }
};

int main(int argc, char const *argv[])
{
  // 2.初始化 ROS2 客户端；
  rclcpp::init(argc, argv);

  // 4.调用spin函数，并传入节点对象指针；
  auto server = std::make_shared<MinimalService>();
  rclcpp::spin(server);

  // 5.释放资源。
  rclcpp::shutdown();
  return 0;
}